
let swap = (a, i, j) => {
    let temp = a[i];
    a[i] = a[j];
    a[j] = temp;
};

/*
* 满二叉树（国内定义）
*/
function isfullBT(t) {
    // 一个二叉树，如果每一个层的结点数都达到最大值，则这个二叉树就是满二叉树。也就是说，如果一个二叉树的层数为K，且结点总数是(2^k) -1 ，则它就是满二叉树。
}

/*
* 大顶堆（完全二叉树）
*        a[0]
* a[0*2+1] a[0*2+2]
*/
function buildMaxHeap(a) {
    let len = a.length;
    if (len <= 1) return;
    let adjustHeap = (a, i) => {
        let maxIndex = i;
        if (i * 2 + 1 < len && a[i * 2 + 1] > a[maxIndex]) {
            maxIndex = i * 2 + 1;
        }
        if (i * 2 + 2< len && a[i * 2 + 2] > a[maxIndex]) {
            maxIndex = i * 2 + 2;
        }
        if (maxIndex != i) {
            swap(a, maxIndex, i);
            adjustHeap(a, maxIndex);
        }
    };
    let i = Math.floor(len / 2) - 1;
    for (; i >= 0; i--){
        adjustHeap(a, i);
    }
}
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
buildMaxHeap(arr);
console.log(arr);

/*
* 二叉查找数
*/
function isBST(t) {
    //1.左子树上所有的节点的值均小于或等于他的根节点的值
    //2.右子数上所有的节点的值均大于或等于他的根节点的值
    //3.左右子树也一定分别为二叉排序树
}

/*
* 红黑树（自平衡二叉查找树）
*/
function isRBT(t) {
    // 红黑树是每个节点都带有颜色属性的二叉查找树，颜色或红色或黑色。
    // 性质1. 节点是红色或黑色。
    // 性质2. 根节点是黑色。
    // 性质3. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
    // 性质4. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
}

/*
* 哈夫曼树（最优二叉树）
*/
function buildHuffman(a) {
    // 路径： 树中一个结点到另一个结点之间的分支构成这两个结点之间的路径。
    // 路径长度：路径上的分枝数目称作路径长度。
    // 结点的带权路径长度：在一棵树中，如果其结点上附带有一个权值，通常把该结点的路径长度与该结点上的权值之积称为该结点的带权路径长度
    // 树的带权路径长度：如果树中每个叶子上都带有一个权值，则把树中所有叶子的带权路径长度之和称为树的带权路径长度。
    // 根据哈弗曼树的定义，一棵二叉树要使其WPL值最小，必须使权值越大的叶子结点越靠近根结点，而权值越小的叶子结点越远离根结点。
    // 依据哈夫曼树可以找出存放一串字符所需的最少的二进制编码。
}